package com.hb.web;

import com.hb.data.SpitterRepository;
import com.hb.model.Spitter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import javax.validation.Valid;

@Controller
@RequestMapping("/spitter")
public class SpitterController {
    private SpitterRepository spitterRepository;

    public SpitterController() {
    }

    @Autowired
    public SpitterController(SpitterRepository spitterRepository) {
        this.spitterRepository = spitterRepository;
    }

    @RequestMapping(value = "/register", method = RequestMethod.GET)
    public String showRegistrationForm(Model model) {
        model.addAttribute(new Spitter());
        return "registerForm";
    }

    @RequestMapping(value = "/register", method = RequestMethod.POST)
    // 1、@Valid 注解是应用校验功能的关键。Spitter 参数添加了 @Valid 注解，这会告知 Spring，需要确保这个对象满足校验限制。
    // 2、在 Spitter 属性上添加校验限制并不能阻止表单提交。即便用户没有填写某个域或者某个域所给定的值超出了最大长度，processRegistration() 方法依然会被调用。
    // 这样，我们就需要处理校验的错误，这些错误可以通过 Errors 对象进行访问，现在这个对象已作为 processRegistration() 方法的参数。
    // （很重要一点需要注意，Errors 参数要紧跟在带有 @Valid 注解的参数后面，@Valid 注解所标注的就是要检验的参数。）
    public String processRegistration(@Valid Spitter spitter, Errors errors) {
        // 如果校验出现错误，则重新返回表单
        if(errors.hasErrors()) {
            return "registerForm";
        }

        spitterRepository.save(spitter);

        // 1、为了防止重复提交（用户点击浏览器的刷新按钮有可能会发生这种情况），应该将浏览器重定向到新创建用户的基本信息页面。
        // 2、当 InternalResourceViewResolver 看到视图格式中的 “redirect:” 前缀时，它就知道要将其解析为重定向的规则，而不是视图的名称。
        // 3、需要注意的是，除了 “redirect:”，InternalResourceViewResolver 还能识别 “forward:” 前缀。当它发现视图格式中以 “forward:” 作为前缀时，
        // 请求将会前往（forward）指定的 URL 路径，而不再是重定向。
        return "redirect:/spitter/" + spitter.getUsername();
    }

    @RequestMapping(value = "/{username}", method = RequestMethod.GET)
    public String showSpitterProfile(@PathVariable String username, Model model) {
        Spitter spitter = spitterRepository.findByUsername(username);
        model.addAttribute(spitter);
        return "profile";
    }
}
